#!/bin/bash

# Java Version Manager Script
# 支持安装、查看、切换、卸载 Java 版本

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 显示艺术字和作者信息
show_banner() {
    echo -e "${PURPLE}"
    echo "     _                        __  __                                   "
    echo "    | | __ ___   ____ _      |  \/  | __ _ _ __   __ _  __ _  ___ _ __ "
    echo " _  | |/ _\` \\ \\ / / _\` |_____| |\\/| |/ _\` | '_ \\ / _\` |/ _\` |/ _ \\ '__|"
    echo "| |_| | (_| |\\ V / (_| |_____| |  | | (_| | | | | (_| | (_| |  __/ |   "
    echo " \\___/ \\__,_| \\_/ \\__,_|     |_|  |_|\\__,_|_| |_|\\__,_|\\__, |\\___|_|   "
    echo "                                                       |___/           "
    
    echo -e "${CYAN}"
    echo "		   适用于Ubuntu系列"
    echo "                   作者: kukuqi666"
    echo "             GitHub: https://github.com/kukuqi666"
    echo -e "${NC}"
    echo "================================================================"
}

# 支持的 Java 版本
SUPPORTED_VERSIONS=("8" "11" "17" "21")

# 包名映射
declare -A PACKAGE_NAMES=(
    ["8"]="openjdk-8-jdk"
    ["11"]="openjdk-11-jdk" 
    ["17"]="openjdk-17-jdk"
    ["21"]="openjdk-21-jdk"
)

# 获取 Java 可执行文件路径
get_java_path() {
    local version=$1
    # Java 8 的特殊路径
    if [[ $version == "8" ]]; then
        echo "/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java"
    else
        echo "/usr/lib/jvm/java-${version}-openjdk-amd64/bin/java"
    fi
}

# 获取 Javac 可执行文件路径
get_javac_path() {
    local version=$1
    # Java 8 的特殊路径
    if [[ $version == "8" ]]; then
        echo "/usr/lib/jvm/java-8-openjdk-amd64/bin/javac"
    else
        echo "/usr/lib/jvm/java-${version}-openjdk-amd64/bin/javac"
    fi
}

# 显示用法
show_usage() {
    echo -e "${GREEN}Java 版本管理脚本${NC}"
    echo "用法: $0 [命令]"
    echo ""
    echo "命令:"
    echo "  install [版本]      安装指定的 Java 版本 (支持: ${SUPPORTED_VERSIONS[*]})"
    echo "  list                列出所有可用的 Java 版本"
    echo "  switch [版本]       切换到指定的 Java 版本"
    echo "  status              显示当前 Java 状态"
    echo "  install-all         安装所有支持的 Java 版本"
    echo "  fix-alternatives    修复所有已安装版本的 alternatives 配置"
    echo "  uninstall [版本]    卸载指定的 Java 版本"
    echo "  uninstall-all       卸载所有 Java 版本"
    echo "  clean               清理下载的包缓存"
    echo ""
    echo "示例:"
    echo "  $0 install 8        安装 Java 8"
    echo "  $0 switch 17        切换到 Java 17"
    echo "  $0 uninstall 11     卸载 Java 11"
    echo "  $0 list             列出所有已安装版本"
    echo "  $0 status           显示当前 Java 状态"
}

# 检查命令是否存在
check_command() {
    if ! command -v $1 &> /dev/null; then
        echo -e "${RED}错误: 未找到 $1 命令${NC}"
        return 1
    fi
    return 0
}

# 检查 root 权限
check_root() {
    if [[ $EUID -ne 0 ]]; then
        echo -e "${RED}错误: 此操作需要 root 权限${NC}"
        exit 1
    fi
}

# 确认操作
confirm_action() {
    local action=$1
    local version=$2
    local current_version=$(java -version 2>&1 | head -n1 | awk -F '"' '{print $2}')
    
    echo -e "${YELLOW}即将执行: $action Java $version${NC}"
    
    if [[ "$current_version" == *"$version"* ]]; then
        echo -e "${RED}警告: 当前正在使用 Java $version${NC}"
        echo -e "${RED}卸载或操作当前版本可能导致问题!${NC}"
    fi
    
    read -p "是否继续? (y/N): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        echo -e "${YELLOW}操作已取消${NC}"
        return 1
    fi
    return 0
}

# 安装 Java 版本
install_java() {
    local version=$1
    
    if [[ -z ${PACKAGE_NAMES[$version]} ]]; then
        echo -e "${RED}错误: 不支持的 Java 版本: $version${NC}"
        echo -e "支持的版本: ${SUPPORTED_VERSIONS[*]}"
        return 1
    fi
    
    local package_name=${PACKAGE_NAMES[$version]}
    local java_path=$(get_java_path $version)
    
    # 检查是否已安装
    if [[ -f $java_path ]]; then
        echo -e "${YELLOW}Java $version 已经安装${NC}"
        update_alternatives $version
        return 0
    fi
    
    echo -e "${YELLOW}安装 $package_name...${NC}"
    apt update && apt install -y $package_name
    
    if [[ $? -eq 0 ]]; then
        echo -e "${GREEN}Java $version 安装成功!${NC}"
        # 添加到 alternatives
        update_alternatives $version
    else
        echo -e "${RED}Java $version 安装失败!${NC}"
        return 1
    fi
}

# 更新 alternatives 配置
update_alternatives() {
    local version=$1
    local java_path=$(get_java_path $version)
    local javac_path=$(get_javac_path $version)
    
    # 移除旧配置（如果存在）
    update-alternatives --remove java $java_path 2>/dev/null
    update-alternatives --remove javac $javac_path 2>/dev/null
    
    if [[ -f $java_path ]]; then
        update-alternatives --install /usr/bin/java java $java_path $((100 + version))
        echo -e "${GREEN}已将 Java $version 添加到版本管理${NC}"
    else
        echo -e "${RED}警告: Java 可执行文件不存在: $java_path${NC}"
        return 1
    fi
    
    if [[ -f $javac_path ]]; then
        update-alternatives --install /usr/bin/javac javac $javac_path $((100 + version))
        echo -e "${GREEN}已将 Javac $version 添加到版本管理${NC}"
    else
        echo -e "${YELLOW}警告: Javac 可执行文件不存在: $javac_path${NC}"
        return 1
    fi
}

# 列出所有 Java 版本
list_java() {
    echo -e "${BLUE}系统中已安装的 Java 版本:${NC}"
    echo -e "${YELLOW}通过 update-alternatives 管理的版本:${NC}"
    echo "Java:"
    update-alternatives --list java 2>/dev/null || echo "暂无版本管理"
    echo "Javac:"
    update-alternatives --list javac 2>/dev/null || echo "暂无版本管理"
    
    echo -e "\n${YELLOW}所有已安装的 Java:${NC}"
    find /usr/lib/jvm -name "java" -type f -executable 2>/dev/null | grep -E "(openjdk|java)" | sort
    
    echo -e "\n${CYAN}支持的 Java 版本:${NC}"
    for version in "${SUPPORTED_VERSIONS[@]}"; do
        local java_path=$(get_java_path $version)
        local javac_path=$(get_javac_path $version)
        if [[ -f $java_path ]] && [[ -f $javac_path ]]; then
            echo -e "  ${GREEN}✓ Java $version${NC} - 完整安装 (java + javac)"
        elif [[ -f $java_path ]]; then
            echo -e "  ${YELLOW}⚠ Java $version${NC} - 部分安装 (只有 java)"
        else
            echo -e "  ${RED}✗ Java $version${NC} - 未安装"
        fi
    done
}

# 切换到指定版本 - 修复版：同时切换 java 和 javac
switch_java() {
    local version=$1
    local java_path=$(get_java_path $version)
    local javac_path=$(get_javac_path $version)
    
    if [[ ! -f $java_path ]]; then
        echo -e "${RED}错误: Java $version 未安装或路径不正确${NC}"
        echo -e "路径: $java_path"
        echo -e "请先运行: $0 install $version"
        return 1
    fi
    
    if [[ ! -f $javac_path ]]; then
        echo -e "${RED}错误: Javac $version 未找到${NC}"
        echo -e "路径: $javac_path"
        echo -e "可能是安装不完整，尝试重新安装"
        return 1
    fi
    
    # 检查是否已注册到 alternatives
    local java_registered=$(update-alternatives --list java | grep -c "$java_path" 2>/dev/null)
    local javac_registered=$(update-alternatives --list javac | grep -c "$javac_path" 2>/dev/null)
    
    if [[ $java_registered -eq 0 ]] || [[ $javac_registered -eq 0 ]]; then
        echo -e "${YELLOW}Java $version 未完全注册到 alternatives，正在修复...${NC}"
        update_alternatives $version
    fi
    
    echo -e "${YELLOW}切换到 Java $version...${NC}"
    
    # 同时切换 java 和 javac
    update-alternatives --set java $java_path
    java_result=$?
    
    update-alternatives --set javac $javac_path
    javac_result=$?
    
    if [[ $java_result -eq 0 ]] && [[ $javac_result -eq 0 ]]; then
        echo -e "${GREEN}已成功切换到 Java $version${NC}"
        echo -e "${GREEN}Java 版本:${NC}"
        java -version 2>&1 | head -n 3
        echo -e "${GREEN}Javac 版本:${NC}"
        javac -version 2>&1
    else
        echo -e "${RED}切换失败!${NC}"
        if [[ $java_result -ne 0 ]]; then
            echo -e "${RED}Java 切换失败${NC}"
        fi
        if [[ $javac_result -ne 0 ]]; then
            echo -e "${RED}Javac 切换失败${NC}"
        fi
        return 1
    fi
}

# 显示当前状态
show_status() {
    echo -e "${BLUE}当前 Java 状态:${NC}"
    echo -e "${YELLOW}Java 版本:${NC}"
    java -version 2>&1 | head -n 3
    
    echo -e "\n${YELLOW}Javac 版本:${NC}"
    javac -version 2>&1
    
    echo -e "\n${YELLOW}JAVA_HOME:${NC}"
    if [[ -n $JAVA_HOME ]]; then
        echo $JAVA_HOME
    else
        echo "未设置"
    fi
    
    echo -e "\n${YELLOW}当前选择的版本:${NC}"
    echo "Java:"
    update-alternatives --display java | grep "link currently points to"
    echo "Javac:"
    update-alternatives --display javac | grep "link currently points to" 2>/dev/null || echo "未配置"
}

# 安装所有支持的版本
install_all() {
    echo -e "${YELLOW}开始安装所有支持的 Java 版本...${NC}"
    
    for version in "${SUPPORTED_VERSIONS[@]}"; do
        echo -e "\n${BLUE}=== 处理 Java $version ===${NC}"
        install_java $version
    done
    
    echo -e "\n${GREEN}所有版本安装完成!${NC}"
}

# 修复 alternatives 配置 - 增强版
fix_alternatives() {
    echo -e "${YELLOW}修复所有已安装 Java 版本的 alternatives 配置...${NC}"
    
    local fixed_count=0
    for version in "${SUPPORTED_VERSIONS[@]}"; do
        local java_path=$(get_java_path $version)
        local javac_path=$(get_javac_path $version)
        
        if [[ -f $java_path ]] && [[ -f $javac_path ]]; then
            echo -e "${BLUE}修复 Java $version...${NC}"
            if update_alternatives $version; then
                ((fixed_count++))
            fi
        elif [[ -f $java_path ]]; then
            echo -e "${YELLOW}Java $version 只有运行时环境，缺少编译器${NC}"
        fi
    done
    
    echo -e "${GREEN}修复完成! 共修复了 $fixed_count 个版本${NC}"
    
    # 显示修复后的状态
    echo -e "\n${CYAN}修复后的状态:${NC}"
    echo "Java alternatives:"
    update-alternatives --list java 2>/dev/null | wc -l | xargs echo "  数量:"
    echo "Javac alternatives:"
    update-alternatives --list javac 2>/dev/null | wc -l | xargs echo "  数量:"
}

# 卸载 Java 版本
uninstall_java() {
    local version=$1
    
    if [[ -z ${PACKAGE_NAMES[$version]} ]]; then
        echo -e "${RED}错误: 不支持的 Java 版本: $version${NC}"
        echo -e "支持的版本: ${SUPPORTED_VERSIONS[*]}"
        return 1
    fi
    
    local package_name=${PACKAGE_NAMES[$version]}
    local java_path=$(get_java_path $version)
    
    # 检查是否已安装
    if [[ ! -f $java_path ]]; then
        echo -e "${YELLOW}Java $version 未安装，无需卸载${NC}"
        return 0
    fi
    
    # 确认操作
    if ! confirm_action "卸载" $version; then
        return 1
    fi
    
    echo -e "${YELLOW}卸载 Java $version...${NC}"
    
    # 从 alternatives 中移除
    local java_path=$(get_java_path $version)
    local javac_path=$(get_javac_path $version)
    
    update-alternatives --remove java $java_path 2>/dev/null
    update-alternatives --remove javac $javac_path 2>/dev/null
    
    # 卸载包
    apt remove -y $package_name
    
    # 清理配置
    apt autoremove -y
    
    echo -e "${GREEN}Java $version 卸载完成!${NC}"
}

# 卸载所有 Java 版本
uninstall_all() {
    echo -e "${RED}警告: 即将卸载所有 Java 版本!${NC}"
    
    if ! confirm_action "卸载所有" "Java 版本"; then
        return 1
    fi
    
    for version in "${SUPPORTED_VERSIONS[@]}"; do
        local package_name=${PACKAGE_NAMES[$version]}
        local java_path=$(get_java_path $version)
        
        if [[ -f $java_path ]]; then
            echo -e "${YELLOW}卸载 Java $version...${NC}"
            
            # 从 alternatives 中移除
            local java_path=$(get_java_path $version)
            local javac_path=$(get_javac_path $version)
            
            update-alternatives --remove java $java_path 2>/dev/null
            update-alternatives --remove javac $javac_path 2>/dev/null
            
            # 卸载包
            apt remove -y $package_name 2>/dev/null
        fi
    done
    
    # 清理
    apt autoremove -y
    
    echo -e "${GREEN}所有 Java 版本卸载完成!${NC}"
}

# 清理缓存
clean_cache() {
    echo -e "${YELLOW}清理包缓存...${NC}"
    apt clean
    apt autoclean
    echo -e "${GREEN}缓存清理完成!${NC}"
}

# 主函数
main() {
    # 显示艺术字和作者信息
    show_banner
    
    local command=$1
    local version=$2
    
    case $command in
        "install")
            check_root
            if [[ -z $version ]]; then
                echo -e "${RED}错误: 请指定要安装的版本${NC}"
                show_usage
                exit 1
            fi
            install_java $version
            ;;
        "list")
            list_java
            ;;
        "switch")
            if [[ -z $version ]]; then
                echo -e "${RED}错误: 请指定要切换的版本${NC}"
                show_usage
                exit 1
            fi
            switch_java $version
            ;;
        "status")
            show_status
            ;;
        "install-all")
            check_root
            install_all
            ;;
        "fix-alternatives")
            check_root
            fix_alternatives
            ;;
        "uninstall")
            check_root
            if [[ -z $version ]]; then
                echo -e "${RED}错误: 请指定要卸载的版本${NC}"
                show_usage
                exit 1
            fi
            uninstall_java $version
            ;;
        "uninstall-all")
            check_root
            uninstall_all
            ;;
        "clean")
            check_root
            clean_cache
            ;;
        ""|"help")
            show_usage
            ;;
        *)
            echo -e "${RED}错误: 未知命令: $command${NC}"
            show_usage
            exit 1
            ;;
    esac
}

# 检查依赖
check_command apt || exit 1
check_command update-alternatives || exit 1

# 运行主函数
main "$@"